\subsection{Tipo}
\begin{lstlisting}
Object subclass: #Tipo
	instanceVariableNames: 'nombre relacionesDeEfectividad'
	classVariableNames: 'tiposExistentes'
	poolDictionaries: ''
	category: 'PLP-TP-POO'
\end{lstlisting}

\subsubsection{Mensajes de Clase}
\textbf{agregarATiposExistentes:} \textit{unTipo}
\begin{lstlisting}
	self tiposExistentes add: unTipo 
\end{lstlisting}

\bigskip

\textbf{cargarTipoAgua}
\begin{lstlisting}
	self 
		cargarTipoLlamado: 'Agua'
		conEfectividadesContraNormal: 1
		fuego: 2
		agua: 1/2
		planta: 1/2
		fantasma: 1
\end{lstlisting}

\bigskip

\textbf{cargarTipoFantasma}
\begin{lstlisting}
	self 
		cargarTipoLlamado: 'Fantasma'
		conEfectividadesContraNormal: 0
		fuego: 1
		agua: 1
		planta: 1
		fantasma: 2
\end{lstlisting}

\newpage

\textbf{cargarTipoFuego}
\begin{lstlisting}
	self 
		cargarTipoLlamado: 'Fuego'
		conEfectividadesContraNormal: 1
		fuego: 1/2
		agua: 1/2
		planta: 2
		fantasma: 1
\end{lstlisting}

\bigskip

\textbf{cargarTipoLlamado} \textit{unNombreTipo}\\
\textbf{conEfectividadesContraNormal} \textit{unValorNormal}\\
\textbf{fuego} \textit{unValorFuego}\\
\textbf{agua} \textit{unValorAgua}\\
\textbf{planta} \textit{unValorPlanta}\\
\textbf{fantasma} \textit{unValorFantasma}
\begin{lstlisting}
	(self new: unNombreTipo)
		efectividad: unValorNormal contra: 'Normal';
		efectividad: unValorFuego contra: 'Fuego';
		efectividad: unValorAgua contra: 'Agua';
		efectividad: unValorPlanta contra: 'Planta';
		efectividad: unValorFantasma contra: 'Fantasma'
\end{lstlisting}

\bigskip

\textbf{cargarTipoNormal}
\begin{lstlisting}
	self 
		cargarTipoLlamado: 'Normal'
		conEfectividadesContraNormal: 1
		fuego: 1
		agua: 1
		planta: 1
		fantasma: 0
\end{lstlisting}

\bigskip

\textbf{cargarTipoPlantal}
\begin{lstlisting}
	self 
		cargarTipoLlamado: 'Planta'
		conEfectividadesContraNormal: 1
		fuego: 1/2
		agua: 2
		planta: 1/2
		fantasma: 1
\end{lstlisting}

\bigskip

\textbf{cargarTiposIniciales}
\begin{lstlisting}
	self cargarTipoNormal.
	self cargarTipoFuego.
	self cargarTipoAgua.
	self cargarTipoPlanta.
	self cargarTipoFantasma
\end{lstlisting}

\bigskip

\textbf{crearNuevoCon:} \textit{unNombreTipo}
\begin{lstlisting}
	|tipo|
	
	tipo := self new inicializarCon: unNombreTipo.
	self agregarATiposExistentes: tipo.
	
	^tipo
\end{lstlisting}

\bigskip

\textbf{existeTipo:} \textit{unNombreTipo}
\begin{lstlisting}
	^(self tiposExistentes 
		select: [:tipo | tipo nombre = unNombreTipo ]) notEmpty 
\end{lstlisting}

\textbf{new:} \textit{unNombreTipo}
\begin{lstlisting}
	 ^self tiposExistentes 
		detect: [:tipo | tipo nombre = unNombreTipo ] 
		ifNone: [self crearNuevoCon: unNombreTipo ]
\end{lstlisting}

\bigskip

\textbf{tiposExistentes}
\begin{lstlisting}
	"lazy initialization"
		
	tiposExistentes isNil
		ifTrue: [tiposExistentes := OrderedCollection new].
	
	^tiposExistentes
\end{lstlisting}


\subsubsection{Mensajes de Instancia}
\textbf{efectividad:} \textit{unValor} \textbf{contra:} \textit{unNombreTipo}
\begin{lstlisting}
	self si: unValor esValidoEjecutar: 
		[ self relacionar: unValor con: unNombreTipo ]
\end{lstlisting}

\bigskip

\textbf{efectividadContra:} \textit{unNombreTipo}
\begin{lstlisting}
 	^relacionesDeEfectividad at: unNombreTipo ifAbsent: [ 1 ]
\end{lstlisting}

\bigskip

\textbf{inicializarCon:} \textit{unNombreTipo}
\begin{lstlisting}
	nombre := nombreTipo.
	relacionesDeEfectividad := Dictionary new.
\end{lstlisting}

\bigskip

\textbf{nombre}
\begin{lstlisting}
	^nombre
\end{lstlisting}

\bigskip

\textbf{relacionar:} \textit{unValor} \textbf{con:} \textit{unNombreTipo}
\begin{lstlisting}
	^ relacionesDeEfectividad at: unNombreTipo put: unValor
\end{lstlisting}

\bigskip

\textbf{si:} \textit{unValor} \textbf{esValidoEjecutar:} \textit{unBloque}
\begin{lstlisting}
	(self valoresPermitidos includes: unValor) 
		ifTrue: unBloque
\end{lstlisting}

\bigskip

\textbf{valoresPermitidos}
\begin{lstlisting}
	^Array 
		with: 0 
		with: 1/2  
		with: 1
		with: 2 
\end{lstlisting}



